package com.mini.mybatis.session;

import com.mini.mybatis.builder.xml.XMLConfigBuilder;
import com.mini.mybatis.session.defaults.DefaultSqlSessionFactory;

import java.io.InputStream;

/**
 * SqlSessionFactory构建器
 * 提供多种方式构建SqlSessionFactory实例
 */
public class SqlSessionFactoryBuilder {
    
    /**
     * 通过输入流构建SqlSessionFactory
     * @param inputStream 配置文件输入流
     * @return SqlSessionFactory实例
     */
    public SqlSessionFactory build(InputStream inputStream) {
        return build(inputStream, null);
    }
    
    /**
     * 通过输入流和环境ID构建SqlSessionFactory
     * @param inputStream 配置文件输入流
     * @param environment 环境ID
     * @return SqlSessionFactory实例
     */
    public SqlSessionFactory build(InputStream inputStream, String environment) {
        try {
            // 创建XML配置构建器
            XMLConfigBuilder parser = new XMLConfigBuilder();
            
            // 解析配置文件
            Configuration config = parser.parse(inputStream);
            
            // 创建SqlSessionFactory
            return build(config);
        } catch (Exception e) {
            throw new RuntimeException("构建SqlSessionFactory时出错。原因: " + e, e);
        } finally {
            try {
                inputStream.close();
            } catch (Exception e) {
                // 忽略关闭异常
            }
        }
    }
    
    /**
     * 通过Configuration对象构建SqlSessionFactory
     * @param config 配置对象
     * @return SqlSessionFactory实例
     */
    public SqlSessionFactory build(Configuration config) {
        return new DefaultSqlSessionFactory(config);
    }
}